//注意事项
//1. 多线程下的线程安全问题   2. 加锁前后两个if判断  3. 返回值问题
#include <iostream>
#include <mutex>
#include <memory>

class Signleton
{
private:
    static Signleton* _istance;
    static std::mutex _mutex;

private:
    Signleton() {}
    Signleton(const Signleton&) = delete;
    Signleton& operator=(const Signleton&) = delete;

public:
    //尽量返回实例对象，而不是指针，返回指针的话要加const，防止外部的修改。
    static Signleton& GetInstance()
    {
        //避免已经有实例的对象了，还在锁处阻塞，导致效率低下
        if(_istance == nullptr)
        {
            std::unique_lock<std::mutex> lock(_mutex);
            //确保只进行一次实例化
            if(_istance == nullptr)
            {
                _istance = new Signleton();
            }
        }
        return *_istance;
    }

};
Signleton* Signleton::_istance = nullptr;
std::mutex Signleton::_mutex;

int main()
{
    Signleton::GetInstance();
    return 0;
}